import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 * La clase CoreGui inicializa y administra los modos de 
 * operación asi como los marcos donde se colocaran
 * todos los componentes de la interfaz gráfica y el teclado. 
 * También proporciona fuciones importantes para la interacción 
 * de la interfaz gráfica con el código nativo. 
 * (Vease la clase InfoManager para más información)<br>
 * Cuenta con dos marcos, uno superior y otro inferior. El marco
 * superior es el que se coloca en la pantalla no táctil y 
 * contendra por lo general componentes no editables pensados
 * solamente para visualizar información. Por otro lado,
 * el marco inferior se coloca en la pantalla táctil y contendra 
 * el teclado virtual, los controles de la máquina, campos 
 * editables y el menú de modo de operación.<br>
 * Los dos marcos tiene un tamaño inicial de 1024x768, siendo este
 * el tamaño mínimo para visualizar correctamente las pantallas.
 * Además, las pantallas se maximizan y adaptan a resoluciones 
 * mayores.
 */
public class CoreGui extends InfoManager
{
    /**
     * Inicializa los modos de operación y los marcos superior
     * e inferior que corresponden a la pantalla normal y 
     * la pantalla táctil.
     */
    public CoreGui()
    {
        super();
        initializeTopFrame();
        initializeBottomFrame();
    }
    /**
     * Inicializa el marco superior
     */
    private void initializeTopFrame()
    {
        topFrame = new JFrame();
        topFrame.setLayout( new GridBagLayout());
        topFrame.setSize(TOP_WIDTH_FINAL, TOP_HEIGHT_FINAL);
        topFrame.setUndecorated(true);
        topFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.anchor = GridBagConstraints.CENTER;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.insets = new Insets(16, 16, 16, 16);
        topFrame.add(Mode.getViewPanel(),constraints);
        topFrame.setVisible(true);
        //topFrame.setLocation(0,0);
        //topFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }
    /**
     * Inicializa el marco inferior
     * @throws si la configuración de la plataforma no permite
     * el control de entradas de bajo nivel, necesario para 
     * crear el teclado virtual.
     */
    private void initializeBottomFrame()
    {
        bottomFrame = new JFrame();
        bottomFrame.setLayout( new GridBagLayout());
        bottomFrame.setSize(BOTTOM_WIDTH_FINAL, BOTTOM_HEIGHT_FINAL);
        bottomFrame.setUndecorated(true);
        bottomFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JSplitPane splitPane;
        try{
            keyboard= new Keyboard();
            splitPane = new JSplitPane( 
                JSplitPane.VERTICAL_SPLIT, 
                false, 
                Mode.getEditablePanel(), 
                keyboard);
        }catch(AWTException exception)
        {
            splitPane = new JSplitPane( 
                JSplitPane.VERTICAL_SPLIT, 
                false, 
                Mode.getEditablePanel(), 
                new JPanel());
        }
        splitPane.setOneTouchExpandable( true);
        splitPane.setDividerSize(30);
        splitPane.setDividerLocation(500);
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.anchor = GridBagConstraints.CENTER;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.insets = new Insets(16, 16, 16, 16);
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(getModesPanel(),BorderLayout.NORTH);
        panel.add(splitPane,BorderLayout.CENTER);
        bottomFrame.add(panel,constraints);
        bottomFrame.setVisible(true);
        bottomFrame.setLocation(0,460);
        //bottomFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }
    /**
     * Crea el menú de modos de operación.
     * @return una lámina que contiene botones para elegir
     * el modo de operación.
     */
    private JPanel getModesPanel()
    {
        JPanel panel = NewComp.getPanel("operationMode", "titleBorderBFrame", new GridLayout(1, 8));
        ButtonGroup group = new ButtonGroup();
        AbstractButton buttonMode;
        for( int i = 0; i < 8; i++)
        {
            buttonMode = getMode(i).getButton();
            group.add(buttonMode);
            panel.add(buttonMode);
        }
        return panel;
    }
    private JRadioButton radioEdit;
    private JRadioButton radioMemory;
    private JRadioButton radioMdi;
    private JRadioButton radioFileManager;
    private JRadioButton radioHandwheel;
    private JRadioButton radioJog;
    private JRadioButton radioRapid;
    private JRadioButton radioZeroReturn;
    private JFrame topFrame;
    private JFrame bottomFrame;
    private static final int TOP_WIDTH_FINAL = 640;//530;//1024;
    private static final int TOP_HEIGHT_FINAL = 480;//320;//768;
    private static final int BOTTOM_WIDTH_FINAL = 640;//1024;
    private static final int BOTTOM_HEIGHT_FINAL = 320;//768;
    private Keyboard keyboard;
}
